/**
 * @addtogroup bcd.h
 * bcd.h
 * @{
 */
/**
 * @file         ofc_bcd.h
 * @brief        Bcd与其它类型的转换.
 * @author       Leo
 * @date         2020-02-07
 * @version      1.2
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2018-11-16  <td>1.0                   <td>Leo             <td>创建初始版本
 * <tr><td>2019-09-20  <td>1.1                   <td>Akee            <td>从Rfc库移植过来
 * <tr><td>2020-02-07  <td>1.2                   <td>Akee            <td>OfTimeToBcd6增加注意事项,内部优化性能
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _OFC_BCD_H_
#define _OFC_BCD_H_

#include "ofc_types.h"

#ifdef __cplusplus
extern "C" {
#endif
/**
 * bcd转换为Byte; 如0x34 -> 34
 * @param value: 原始的bcd值
 * @return 返回十进制值
 */
Byte OfBcdToByte(Byte value);

/**
 * Byte转换为bcd; 如34->0x34
 * @param value: 需要转换的值,范围0-99
 * @return 返回bcd码
 */
Byte OfByteToBcd(Byte value);

/**
 * bcd转换为Int; 如0x12345678 -> 12345678
 * @param value: 原始的bcd值
 * @return 返回十进制值
 */
Int32 OfBcdToInt(Int32 value);

/**
 * Byte转换为bcd; 如12345678->0x12345678
 * @param value: 需要转换的值,范围0-99999999
 * @return 返回bcd码
 */
Int32 OfIntToBcd(Int32 value);

/**
 * time_t类型转换成6位bcd
 * @param time: 输入的时间值
 * @param bcd: 输出bcd的缓冲区,长度必须>=6字节
 * @note 不检查参数的有效性,不作时区转换,注意输入格式是否正确;输出"YYMMDDHHNNSS",内部会直接对年份减去2000
 * @return 无返回值,访问缓冲区得到bcd码
 */
void OfTimeToBcd6(TTime time, Byte *bcd);

/**
 * time_t类型转换成7位bcd
 * @param time: 输入的时间值
 * @param bcd: 输出bcd的缓冲区,长度必须>=7字节
 * @note 不检查参数的有效性,不作时区转换,注意输入格式是否正确;输出"YYYYMMDDHHNNSS"
 * @return 无返回值,访问缓冲区得到bcd码
 */
void OfTimeToBcd7(TTime time, Byte *bcd);

/**
 * 6位bcd转换为time_t
 * @param bcd: bcd格式的时间. 长度必须>=6字节
 * @note 不检查参数的有效性,不作时区转换,注意输入格式是否正确;输出 20YY-MM-DD HH:NN:SS对应的time_t
 * @return 返回转换出来的time_t格式时间
 */
TTime OfBcd6ToTime(const Byte *bcd);

/**
 * 7位bcd转换为time_t
 * @param bcd: bcd格式的时间. 长度必须>=7字节
 * @note 不检查参数的有效性,不作时区转换,注意输入格式是否正确;输出 YYYY-MM-DD HH:NN:SS
 * @return 返回转换出来的time_t格式时间
 */
TTime OfBcd7ToTime(const Byte *bcd);

/**
 * bcd格式的日期转换为time_t; 0x010512 -> 1335830400 (20120501对应的UTC时间)
 * @param bcd: Bcd格式化的日期.长度必须>=3字节
 * @return 返回转换出来的time_t格式时间
 * @note 年份是只有后2位,高两位内部设定为20，内部年份会加2000
 */
 
TTime OfBcd3ToDate(const Int32 bcd);

/**
 * bcd格式的日期转换为time_t; 0x01051220-> 1335830400 (20120501对应的UTC时间)
 * @param bcd: Bcd格式化的日期.长度必须>=4字节
 * @return 返回转换出来的time_t格式时间
 */
TTime OfBcd4ToDate(const Int32 bcd);

/**
 * time_t类型的日期转换成bcd,并存储到bcd中; 1335830400 -> 0x010512 (20120501对应的UTC时间)
 * @param dt: 要转换的时间
 * @return 返回bcd格式的时间. 年在最低字节.月其次,再次是日.最高字节为0
 * @note 输出6字节的bcd码.年份必须为2000开始的，内部会减去2000的年份
 */
Int32 OfDateToBcd3(const TTime dt);

/**
 * time_t类型的日期转换成bcd,并存储到bcd中; 1335830400 -> 0x01051220 (20120501对应的UTC时间)
 * @param dt: 要转换的时间
 * @return 返回bcd格式的时间. 年的高两位在最低字节.年的低两位其次,再次是月.最高字节为日
 */
Int32 OfDateToBcd4(const TTime dt);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // _OFC_BCD_H_

/**
 * @}
 */
